home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Camelot / Camelot 043 (1989-06)(Swedish User Group of Amiga)(SE)(PD)[WB].zip / Camelot 043 (1989-06)(Swedish User Group of Amiga)(SE)(PD)[WB].adf / zc / nodes.h < prev    next >
C/C++ Source or Header  |  1989-03-08  |  4KB  |  202 lines

  1. /* Copyright (c) 1988 by Sozobon, Limited.  Author: Johann Ruegg
  2.  *
  3.  * Permission is granted to anyone to use this software for any purpose
  4.  * on any computer system, and to redistribute it freely, with the
  5.  * following restrictions:
  6.  * 1) No charge may be made other than reasonable charges for reproduction.
  7.  * 2) Modified versions must be clearly marked as such.
  8.  * 3) The authors are not responsible for any harmful consequences
  9.  *    of using this software, even if they result from defects in it.
  10.  *
  11.  *    nodes.h
  12.  */
  13.  
  14. /*
  15.  *    stuff common to all nodes
  16.  */
  17. #define COMMON    int cflags;    \
  18.         int fill;    \
  19.         union node *left;    \
  20.         union node *right;    \
  21.         union node *tptr;    \
  22.         union node *nm_ext;    \
  23.         char cname[NMSIZE]
  24.  
  25. #define n_flags e.cflags
  26. #define n_left    e.left
  27. #define n_next    e.left
  28. #define n_right e.right
  29. #define n_tptr    e.tptr
  30. #define n_nmx    e.nm_ext
  31. #define n_name    e.cname
  32.  
  33. /*
  34.  *    expression (and symbol table) node
  35.  */
  36. struct enode {
  37.     COMMON;
  38.     int    token;        /* must be same place as tnode */
  39.     int    eflags;
  40.     char    etype;        /* type of node */
  41.     char    sc;
  42.     char    eprec;
  43.     char    rno;
  44.     union {
  45.         long    vival;
  46.         long    voffs;
  47.         double    vfval;
  48.     } vu;
  49.     char    fldw, fldof;        /* use if cant do fields */
  50. /*    unsigned    fldw:6, fldof:6;    /* use fields just so
  51.                         we know fields work */
  52. };
  53.  
  54. #define e_token e.token
  55. #define e_flags e.eflags
  56. #define e_prec    e.eprec
  57. #define e_rno    e.rno
  58. #define e_type    e.etype
  59. #define e_ival    e.vu.vival
  60. #define e_offs    e.vu.voffs
  61. #define e_fval    e.vu.vfval
  62. #define e_sc    e.sc
  63. #define e_fldw    e.fldw
  64. #define e_fldo    e.fldof
  65.  
  66. /* for e_flags values, see tok.h */
  67.  
  68. /* values for e_type */
  69.  
  70. #define E_LEAF    0    /* no descendants */
  71. #define E_UNARY 1    /* left node is expr, no right node */
  72. #define E_BIN    2    /* left and right are expr */
  73. #define E_SPEC    3    /* special '(', '[', '.', '->', ... */
  74.  
  75. /*
  76.  * code generation node
  77.  */
  78. struct gnode {
  79.     COMMON;
  80.     int    token;
  81.     int    eflags;
  82.     char    etype;
  83.     char    sc;
  84. /* all of above fields must match first fields in enode! */
  85.  
  86.     char    needs;        /* registers needed */
  87.     char    grno;        /* register used in ret value */
  88.     char    basety;     /* type FLOAT, UNS, INT or AGREG */
  89.     char    basesz;     /* size 1,2,4 or 3 -> see bsize */
  90.     char    gr1, gr2;
  91.     char    *betwc;     /* code for between L and R */
  92.     long    goffs;        /* offsets for OREG, ONAME */
  93.     union gu {
  94.         long    bsize;        /* AGREG size or misc. */
  95.         struct {
  96. /*            int    gfldw:6, gfldo:6;    /* field info */
  97.             char    gfldw, gfldo;    /* use if no fields */
  98.         } gfl;
  99.     } gu;
  100. };
  101.  
  102. #define g_token g.token
  103. #define g_flags g.eflags
  104. #define g_type    g.etype
  105. #define g_sc    g.sc
  106. #define g_needs g.needs
  107. #define g_rno    g.grno
  108. #define g_offs    g.goffs
  109. #define g_betw    g.betwc
  110. #define g_ty    g.basety
  111. #define g_sz    g.basesz
  112. #define g_code    g.tptr
  113. #define g_bsize g.gu.bsize
  114. #define g_fldw    g.gu.gfl.gfldw
  115. #define g_fldo    g.gu.gfl.gfldo
  116. #define g_r1    g.gr1
  117. #define g_r2    g.gr2
  118.  
  119. /* types of operands -- ordered in cast strength order */
  120. #define ET_S    1    /* signed integer */
  121. #define ET_U    2    /* unsigned integer */
  122. #define ET_F    3    /* float or double */
  123. #define ET_A    4    /* aggregate */
  124.  
  125. /*
  126.  *    type list node
  127.  */
  128. struct tnode {
  129.     COMMON;
  130.     int    token;        /* must be same place as enode */
  131.     int    tflags;
  132.     char    aln;        /* alignment needed */
  133.     long    tsize;
  134. };
  135.  
  136. #define t_token t.token
  137. #define t_flags t.tflags
  138. #define t_size    t.tsize
  139. #define t_aln    t.aln
  140.  
  141. /*
  142.  *    name extension node
  143.  */
  144. struct nmext {
  145.     COMMON;
  146.     char nmx[NMXSIZE-NMSIZE];    /* name extension (with name)*/
  147. };
  148.  
  149. #define x_nm    x.nmx
  150.  
  151. /*
  152.  *    block info node
  153.  */
  154. struct bnode {
  155.     COMMON;
  156.     union node *syms;
  157.     union node *tags;
  158.     int    regs;        /* reg alloc mask */
  159.     long    lsize;        /* size of locals */
  160.     int    tmsize;     /* max tmps used for 1 expr */
  161. };
  162.  
  163. #define b_syms    b.syms
  164. #define b_tags    b.tags
  165. #define b_regs    b.regs
  166. #define b_size    b.lsize
  167. #define b_tsize b.tmsize
  168.  
  169. /*
  170.  *    node to hold case for switch generation
  171.  */
  172. struct cnode {
  173.     COMMON;
  174.     int    c_value;    /* value for case */
  175.     int    c_label;    /* case label or label label */
  176.     int    c_def;        /* label defined */
  177. };
  178.  
  179. #define c_defined c.c_def
  180. #define c_casev c.c_value
  181. #define c_casel c.c_label
  182.  
  183. union node {
  184.     struct enode e;
  185.     struct tnode t;
  186.     struct nmext x;
  187.     struct bnode b;
  188.     struct cnode c;
  189.     struct gnode g;
  190. };
  191.  
  192. typedef union node NODE;
  193. typedef NODE *NODEP;
  194.  
  195. /* defines for n_flags */
  196.  
  197. #define N_BRKPR 1    /* break printnode recursion */
  198. #define N_COPYT 2    /* tptr is a copy */
  199. #define N_ISFREE 4    /* node is on free list (error check) */
  200.  
  201. NODEP allocnode();
  202.